Code coverage report for src/index.js

Statements: 73.42% (58 / 79)      Branches: 56.25% (36 / 64)      Functions: 54.55% (6 / 11)      Lines: 73.42% (58 / 79)      Ignored: none     

All files » src/ » index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 1621     1   1   1   1   1 5 5 20 20 2 2 18           1   1 1 1           1 5       5 5   5           3 3     5   5     1 20   20 2     18 2     16 16   16 16 16   16 40   40 19   21       16 27 4 23 7   16       16     1                 1                                 1                                               1     1 1 1   1 9          
System.register([], function (_export) {
  'use strict';
 
  var r20, rbracket, class2type;
 
  _export('relativeToFile', relativeToFile);
 
  _export('join', join);
 
  _export('buildQueryString', buildQueryString);
 
  function trimDots(ary) {
    var i, part;
    for (i = 0; i < ary.length; ++i) {
      part = ary[i];
      if (part === '.') {
        ary.splice(i, 1);
        i -= 1;
      } else if (part === '..') {
        // If at the start, or previous value is still ..,
        // keep them so that when converted to a path it may
        // still work when converted to a path, even though
        // as an ID it is less than ideal. In larger point
        // releases, may be better to just kick out an error.
        Iif (i === 0 || i == 1 && ary[2] === '..' || ary[i - 1] === '..') {
          continue;
        } else Eif (i > 0) {
          ary.splice(i - 1, 2);
          i -= 2;
        }
      }
    }
  }
 
  function relativeToFile(name, file) {
    var lastIndex,
        normalizedBaseParts,
        fileParts = file && file.split('/');
 
    name = name.trim();
    name = name.split('/');
 
    if (name[0].charAt(0) === '.' && fileParts) {
      //Convert file to array, and lop off the last part,
      //so that . matches that 'directory' and not name of the file's
      //module. For instance, file of 'one/two/three', maps to
      //'one/two/three.js', but we want the directory, 'one/two' for
      //this normalization.
      normalizedBaseParts = fileParts.slice(0, fileParts.length - 1);
      name = normalizedBaseParts.concat(name);
    }
 
    trimDots(name);
 
    return name.join('/');
  }
 
  function join(path1, path2) {
    var url1, url2, url3, i, ii, urlPrefix, trailingSlash;
 
    if (!path1) {
      return path2;
    }
 
    if (!path2) {
      return path1;
    }
 
    urlPrefix = path1.indexOf('//') === 0 ? '//' : path1.indexOf('/') === 0 ? '/' : '';
    trailingSlash = path2.slice(-1) == '/' ? '/' : '';
 
    url1 = path1.split('/');
    url2 = path2.split('/');
    url3 = [];
 
    for (i = 0, ii = url1.length; i < ii; ++i) {
      Iif (url1[i] == '..') {
        url3.pop();
      } else if (url1[i] == '.' || url1[i] == '') {
        continue;
      } else {
        url3.push(url1[i]);
      }
    }
 
    for (i = 0, ii = url2.length; i < ii; ++i) {
      if (url2[i] == '..') {
        url3.pop();
      } else if (url2[i] == '.' || url2[i] == '') {
        continue;
      } else {
        url3.push(url2[i]);
      }
    }
 
    return urlPrefix + url3.join('/').replace(/\:\//g, '://') + trailingSlash;
  }
 
  function type(obj) {
    if (obj == null) {
      return obj + '';
    }
 
    // Support: Android<4.0 (functionish RegExp)
    return typeof obj === 'object' || typeof obj === 'function' ? class2type[toString.call(obj)] || 'object' : typeof obj;
  }
 
  function buildQueryString(a, traditional) {
    var prefix,
        s = [],
        add = function add(key, value) {
      // If value is a function, invoke it and return its value
      value = typeof value === 'function' ? value() : value == null ? '' : value;
      s[s.length] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
    };
 
    for (prefix in a) {
      _buildQueryString(prefix, a[prefix], traditional, add);
    }
 
    // Return the resulting serialization
    return s.join('&').replace(r20, '+');
  }
 
  function _buildQueryString(prefix, obj, traditional, add) {
    var name;
 
    if (Array.isArray(obj)) {
      // Serialize array item.
      obj.forEach(function (v, i) {
        if (traditional || rbracket.test(prefix)) {
          // Treat each array item as a scalar.
          add(prefix, v);
        } else {
          // Item is non-scalar (array or object), encode its numeric index.
          _buildQueryString(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add);
        }
      });
    } else if (!traditional && type(obj) === 'object') {
      // Serialize object item.
      for (name in obj) {
        _buildQueryString(prefix + '[' + name + ']', obj[name], traditional, add);
      }
    } else {
      // Serialize scalar item.
      add(prefix, obj);
    }
  }
  return {
    setters: [],
    execute: function () {
      r20 = /%20/g;
      rbracket = /\[\]$/;
      class2type = {};
 
      'Boolean Number String Function Array Date RegExp Object Error'.split(' ').forEach(function (name, i) {
        class2type['[object ' + name + ']'] = name.toLowerCase();
      });
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3BhdGgvc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztNQXdGSSxHQUFHLEVBQ0gsUUFBUSxFQUNSLFVBQVU7OzRCQW5FRSxjQUFjOztrQkF1QmQsSUFBSTs7OEJBNkRKLGdCQUFnQjs7QUEzR2hDLFdBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUNyQixRQUFJLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDWixTQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDN0IsVUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLFVBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtBQUNkLFdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLFNBQUMsSUFBSSxDQUFDLENBQUM7T0FDVixNQUFNLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTs7Ozs7O0FBTXRCLFlBQUksQ0FBQyxLQUFLLENBQUMsSUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEFBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtBQUMvRCxtQkFBUztTQUNaLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2QsYUFBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLFdBQUMsSUFBSSxDQUFDLENBQUM7U0FDVjtPQUNKO0tBQ0o7R0FDRjs7QUFFTSxXQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFDO0FBQ3hDLFFBQUksU0FBUztRQUNULG1CQUFtQjtRQUNuQixTQUFTLEdBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEFBQUMsQ0FBQzs7QUFFMUMsUUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNuQixRQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxTQUFTLEVBQUU7Ozs7OztBQU14Qyx5QkFBbUIsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQy9ELFVBQUksR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDM0M7O0FBRUQsWUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDOztBQUVmLFdBQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUN2Qjs7QUFFTSxXQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQ2pDLFFBQUksSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDOztBQUV0RCxRQUFHLENBQUMsS0FBSyxFQUFDO0FBQ1IsYUFBTyxLQUFLLENBQUM7S0FDZDs7QUFFRCxRQUFHLENBQUMsS0FBSyxFQUFDO0FBQ1IsYUFBTyxLQUFLLENBQUM7S0FDZDs7QUFFRCxhQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUNoQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2hELGlCQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDOztBQUVsRCxRQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixRQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixRQUFJLEdBQUcsRUFBRSxDQUFDOztBQUVWLFNBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLFVBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtBQUNuQixZQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7T0FDWixNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0FBQzFDLGlCQUFTO09BQ1YsTUFBTTtBQUNMLFlBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDcEI7S0FDRjs7QUFFRCxTQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtBQUN6QyxVQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDbkIsWUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO09BQ1osTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUMxQyxpQkFBUztPQUNWLE1BQU07QUFDTCxZQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ3BCO0tBQ0Y7O0FBRUQsV0FBTyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLGFBQWEsQ0FBQztHQUMzRTs7QUFVRCxXQUFTLElBQUksQ0FBRSxHQUFHLEVBQUU7QUFDbEIsUUFBSSxHQUFHLElBQUksSUFBSSxFQUFDO0FBQ2QsYUFBTyxHQUFHLEdBQUcsRUFBRSxDQUFDO0tBQ2pCOzs7QUFHRCxXQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsS0FBSyxVQUFVLEdBQ3ZELFVBQVUsQ0FBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLElBQUksUUFBUSxHQUM1QyxPQUFPLEdBQUcsQ0FBQztHQUNoQjs7QUFFTSxXQUFTLGdCQUFnQixDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUM7QUFDOUMsUUFBSSxNQUFNO1FBQ04sQ0FBQyxHQUFHLEVBQUU7UUFDTixHQUFHLEdBQUcsU0FBTixHQUFHLENBQVksR0FBRyxFQUFFLEtBQUssRUFBRTs7QUFFekIsV0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLFVBQVUsR0FBRyxLQUFLLEVBQUUsR0FBSSxLQUFLLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxLQUFLLEFBQUMsQ0FBQztBQUM3RSxPQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN6RSxDQUFDOztBQUVOLFNBQUksTUFBTSxJQUFJLENBQUMsRUFBQztBQUNkLHVCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3hEOzs7QUFHRCxXQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUN0Qzs7QUFFRCxXQUFTLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBQztBQUN2RCxRQUFJLElBQUksQ0FBQzs7QUFFVCxRQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUM7O0FBRXJCLFNBQUcsQ0FBQyxPQUFPLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFLO0FBQ3BCLFlBQUcsV0FBVyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUM7O0FBRXRDLGFBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEIsTUFBSzs7QUFFSiwyQkFBaUIsQ0FDZixNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBLEFBQUMsR0FBRyxHQUFHLEVBQ3JELENBQUMsRUFDRCxXQUFXLEVBQ1gsR0FBRyxDQUNKLENBQUM7U0FDSDtPQUNGLENBQUMsQ0FBQztLQUNKLE1BQU0sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFDOztBQUVoRCxXQUFLLElBQUksSUFBSSxHQUFHLEVBQUU7QUFDaEIseUJBQWlCLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7T0FDM0U7S0FDRixNQUFLOztBQUVKLFNBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDbEI7R0FDRjs7OztBQWhFRyxTQUFHLEdBQUcsTUFBTTtBQUNaLGNBQVEsR0FBRyxPQUFPO0FBQ2xCLGdCQUFVLEdBQUcsRUFBRTs7QUFFbkIscUVBQStELENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLElBQUksRUFBRSxDQUFDLEVBQUs7QUFDOUYsa0JBQVUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztPQUMxRCxDQUFDLENBQUMiLCJmaWxlIjoiL1VzZXJzL0Vpc2VuYmVyZ0VmZmVjdC9Eb2N1bWVudHMvR2l0SHViL1RoZSBEdXJhbmRhbCBQcm9qZWN0L2F1cmVsaWEvcGF0aC9zcmMvaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiB0cmltRG90cyhhcnkpIHtcbiAgdmFyIGksIHBhcnQ7XG4gIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyArK2kpIHtcbiAgICAgIHBhcnQgPSBhcnlbaV07XG4gICAgICBpZiAocGFydCA9PT0gJy4nKSB7XG4gICAgICAgICAgYXJ5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICBpIC09IDE7XG4gICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgICAgICAvLyBJZiBhdCB0aGUgc3RhcnQsIG9yIHByZXZpb3VzIHZhbHVlIGlzIHN0aWxsIC4uLFxuICAgICAgICAgIC8vIGtlZXAgdGhlbSBzbyB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCBpdCBtYXlcbiAgICAgICAgICAvLyBzdGlsbCB3b3JrIHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCwgZXZlbiB0aG91Z2hcbiAgICAgICAgICAvLyBhcyBhbiBJRCBpdCBpcyBsZXNzIHRoYW4gaWRlYWwuIEluIGxhcmdlciBwb2ludFxuICAgICAgICAgIC8vIHJlbGVhc2VzLCBtYXkgYmUgYmV0dGVyIHRvIGp1c3Qga2ljayBvdXQgYW4gZXJyb3IuXG4gICAgICAgICAgaWYgKGkgPT09IDAgfHwgKGkgPT0gMSAmJiBhcnlbMl0gPT09ICcuLicpIHx8IGFyeVtpIC0gMV0gPT09ICcuLicpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICBhcnkuc3BsaWNlKGkgLSAxLCAyKTtcbiAgICAgICAgICAgICAgaSAtPSAyO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVUb0ZpbGUobmFtZSwgZmlsZSl7XG4gIHZhciBsYXN0SW5kZXgsXG4gICAgICBub3JtYWxpemVkQmFzZVBhcnRzLFxuICAgICAgZmlsZVBhcnRzID0gKGZpbGUgJiYgZmlsZS5zcGxpdCgnLycpKTtcblxuICBuYW1lID0gbmFtZS50cmltKCk7XG4gIG5hbWUgPSBuYW1lLnNwbGl0KCcvJyk7XG5cbiAgaWYgKG5hbWVbMF0uY2hhckF0KDApID09PSAnLicgJiYgZmlsZVBhcnRzKSB7XG4gICAgICAvL0NvbnZlcnQgZmlsZSB0byBhcnJheSwgYW5kIGxvcCBvZmYgdGhlIGxhc3QgcGFydCxcbiAgICAgIC8vc28gdGhhdCAuIG1hdGNoZXMgdGhhdCAnZGlyZWN0b3J5JyBhbmQgbm90IG5hbWUgb2YgdGhlIGZpbGUnc1xuICAgICAgLy9tb2R1bGUuIEZvciBpbnN0YW5jZSwgZmlsZSBvZiAnb25lL3R3by90aHJlZScsIG1hcHMgdG9cbiAgICAgIC8vJ29uZS90d28vdGhyZWUuanMnLCBidXQgd2Ugd2FudCB0aGUgZGlyZWN0b3J5LCAnb25lL3R3bycgZm9yXG4gICAgICAvL3RoaXMgbm9ybWFsaXphdGlvbi5cbiAgICAgIG5vcm1hbGl6ZWRCYXNlUGFydHMgPSBmaWxlUGFydHMuc2xpY2UoMCwgZmlsZVBhcnRzLmxlbmd0aCAtIDEpO1xuICAgICAgbmFtZSA9IG5vcm1hbGl6ZWRCYXNlUGFydHMuY29uY2F0KG5hbWUpO1xuICB9XG5cbiAgdHJpbURvdHMobmFtZSk7XG5cbiAgcmV0dXJuIG5hbWUuam9pbignLycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gam9pbihwYXRoMSwgcGF0aDIpIHtcbiAgdmFyIHVybDEsIHVybDIsIHVybDMsIGksIGlpLCB1cmxQcmVmaXgsIHRyYWlsaW5nU2xhc2g7XG5cbiAgaWYoIXBhdGgxKXtcbiAgICByZXR1cm4gcGF0aDI7XG4gIH1cblxuICBpZighcGF0aDIpe1xuICAgIHJldHVybiBwYXRoMTtcbiAgfVxuXG4gIHVybFByZWZpeCA9IHBhdGgxLmluZGV4T2YoJy8vJykgPT09IDAgPyAnLy8nIDpcbiAgICAgICAgICAgICAgcGF0aDEuaW5kZXhPZignLycpID09PSAwID8gJy8nIDogJyc7XG4gIHRyYWlsaW5nU2xhc2ggPSBwYXRoMi5zbGljZSgtMSkgPT0gJy8nID8gJy8nIDogJyc7XG5cbiAgdXJsMSA9IHBhdGgxLnNwbGl0KCcvJyk7XG4gIHVybDIgPSBwYXRoMi5zcGxpdCgnLycpO1xuICB1cmwzID0gW107XG5cbiAgZm9yIChpID0gMCwgaWkgPSB1cmwxLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICBpZiAodXJsMVtpXSA9PSAnLi4nKSB7XG4gICAgICB1cmwzLnBvcCgpO1xuICAgIH0gZWxzZSBpZiAodXJsMVtpXSA9PSAnLicgfHwgdXJsMVtpXSA9PSAnJykge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVybDMucHVzaCh1cmwxW2ldKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGkgPSAwLCBpaSA9IHVybDIubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgIGlmICh1cmwyW2ldID09ICcuLicpIHtcbiAgICAgIHVybDMucG9wKCk7XG4gICAgfSBlbHNlIGlmICh1cmwyW2ldID09ICcuJyB8fCB1cmwyW2ldID09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXJsMy5wdXNoKHVybDJbaV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cmxQcmVmaXggKyB1cmwzLmpvaW4oJy8nKS5yZXBsYWNlKC9cXDpcXC8vZywgJzovLycpICsgdHJhaWxpbmdTbGFzaDtcbn1cblxudmFyIHIyMCA9IC8lMjAvZyxcbiAgICByYnJhY2tldCA9IC9cXFtcXF0kLyxcbiAgICBjbGFzczJ0eXBlID0ge307XG5cbidCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yJy5zcGxpdCgnICcpLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgY2xhc3MydHlwZVsnW29iamVjdCAnICsgbmFtZSArICddJ10gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG59KTtcblxuZnVuY3Rpb24gdHlwZSggb2JqICl7XG4gIGlmIChvYmogPT0gbnVsbCl7XG4gICAgcmV0dXJuIG9iaiArIFwiXCI7XG4gIH1cblxuICAvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMCAoZnVuY3Rpb25pc2ggUmVnRXhwKVxuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbChvYmopIF0gfHwgJ29iamVjdCdcbiAgICA6IHR5cGVvZiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFF1ZXJ5U3RyaW5nKGEsIHRyYWRpdGlvbmFsKXtcbiAgdmFyIHByZWZpeCxcbiAgICAgIHMgPSBbXSxcbiAgICAgIGFkZCA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgLy8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlXG4gICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUoKSA6ICh2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZSk7XG4gICAgICAgIHNbcy5sZW5ndGhdID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgICAgfTtcblxuICBmb3IocHJlZml4IGluIGEpe1xuICAgIF9idWlsZFF1ZXJ5U3RyaW5nKHByZWZpeCwgYVtwcmVmaXhdLCB0cmFkaXRpb25hbCwgYWRkKTtcbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cbiAgcmV0dXJuIHMuam9pbignJicpLnJlcGxhY2UocjIwLCAnKycpO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRRdWVyeVN0cmluZyhwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCl7XG4gIHZhciBuYW1lO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpe1xuICAgIC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLlxuICAgIG9iai5mb3JFYWNoKCh2LCBpKSA9PiB7XG4gICAgICBpZih0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KHByZWZpeCkpe1xuICAgICAgICAvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG4gICAgICAgIGFkZChwcmVmaXgsIHYpO1xuICAgICAgfSBlbHNle1xuICAgICAgICAvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cbiAgICAgICAgX2J1aWxkUXVlcnlTdHJpbmcoXG4gICAgICAgICAgcHJlZml4ICsgJ1snICsgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IGkgOiAnJykgKyAnXScsXG4gICAgICAgICAgdixcbiAgICAgICAgICB0cmFkaXRpb25hbCxcbiAgICAgICAgICBhZGRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIGlmICghdHJhZGl0aW9uYWwgJiYgdHlwZShvYmopID09PSAnb2JqZWN0Jyl7XG4gICAgLy8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuICAgIGZvciAobmFtZSBpbiBvYmopIHtcbiAgICAgIF9idWlsZFF1ZXJ5U3RyaW5nKHByZWZpeCArICdbJyArIG5hbWUgKyAnXScsIG9ialtuYW1lXSwgdHJhZGl0aW9uYWwsIGFkZCk7XG4gICAgfVxuICB9IGVsc2V7XG4gICAgLy8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuICAgIGFkZChwcmVmaXgsIG9iaik7XG4gIH1cbn1cbiJdfQ==